package cn.com.blueInfo.bpm.system.service.impl;

import cn.com.blueInfo.bpm.system.convert.TenantConvert;
import cn.com.blueInfo.bpm.system.entity.Tenant;
import cn.com.blueInfo.bpm.system.repository.TenantRepository;
import cn.com.blueInfo.bpm.system.request.TenantDTO;
import cn.com.blueInfo.bpm.system.response.TenantVO;
import cn.com.blueInfo.bpm.system.service.TenantService;
import cn.com.blueInfo.core.config.CommonConfig;
import cn.com.blueInfo.core.util.SnowflakeIdGenerator;
import cn.com.blueInfo.utils.result.ResultInfo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 租户定义表 业务服务实现类
 * @author suxch
 * @since 2025-09-01 19:17:41
 */
@Log4j2
@Service
public class TenantServiceImpl implements TenantService {

    @Autowired
    private TenantRepository tenantRepository;

    @Autowired
    private SnowflakeIdGenerator snowflakeIdGenerator;

    @Autowired
    private TenantConvert tenantConvert;

    @Autowired
    private CommonConfig commonConfig;

    /**
     * 新增租户定义
     * @param tenantDTO 租户定义参数
     */
    @Override
    public ResultInfo<Integer> addTenant(TenantDTO tenantDTO) {
        if (commonConfig.isSupper()) {
            tenantDTO.setCreateUserId(null);
        }
        Tenant tenant = tenantConvert.dtoToEntity(tenantDTO);
        tenant.setId(snowflakeIdGenerator.nextId());
        Integer addSize = tenantRepository.createTenant(tenant);
        return ResultInfo.<Integer>builder().data(addSize).message("租户定义成功新增 {} 条").build();
    }

    /**
     * 批量新增租户定义
     * @param tenantDTOList 租户定义参数列表
     */
    @Override
    public ResultInfo<Integer> batchAddTenant(List<TenantDTO> tenantDTOList) {
        List<Tenant> tenantList = tenantConvert.dtoToEntity(tenantDTOList);
        for (Tenant tenant : tenantList) tenant.setId(snowflakeIdGenerator.nextId());
        Integer addSize = tenantRepository.batchCreateTenant(tenantList);
        return ResultInfo.<Integer>builder().data(addSize).message("租户定义成功新增 {} 条").build();
    }

    /**
     * 删除租户定义
     * @param tenantId 租户定义ID
     */
    @Override
    public ResultInfo<Integer> removeTenant(Long tenantId) {
        Integer removeSize = tenantRepository.deleteTenant(tenantId);
        return ResultInfo.<Integer>builder().data(removeSize).message("租户定义成功删除 {} 条").build();
    }

    /**
     * 批量删除租户定义
     * @param tenantIdList 租户定义ID列表
     */
    @Override
    public ResultInfo<Integer> batchRemoveTenant(List<Long> tenantIdList) {
        Integer removeSize = tenantRepository.batchDeleteTenant(tenantIdList);
        return ResultInfo.<Integer>builder().data(removeSize).message("租户定义成功删除 {} 条").build();
    }

    /**
     * 更新部分租户定义
     * @param tenantUpdatePartialDTO 租户定义参数
     */
    @Override
    public ResultInfo<Integer> modifyTenantPartial(TenantDTO.UpdatePartialDTO tenantUpdatePartialDTO) {
        if (commonConfig.isSupper()) {
            tenantUpdatePartialDTO.setCreateUserId(null);
        }
        Tenant tenant = tenantConvert.dtoToEntity(tenantUpdatePartialDTO);
        Integer modifySize = tenantRepository.updateTenantPartial(tenant);
        return ResultInfo.<Integer>builder().data(modifySize).message("租户定义成功更新 {} 条").build();
    }

    /**
     * 更新全部租户定义
     * @param tenantDTO 租户定义参数
     */
    @Override
    public ResultInfo<Integer> modifyTenant(TenantDTO tenantDTO) {
        if (commonConfig.isSupper()) {
            tenantDTO.setCreateUserId(null);
        }
        Tenant tenant = tenantConvert.dtoToEntity(tenantDTO);
        Integer modifySize = tenantRepository.updateTenant(tenant);
        return ResultInfo.<Integer>builder().data(modifySize).message("租户定义成功更新 {} 条").build();
    }

    /**
     * 查询一条租户定义
     * @param tenantId 租户定义ID
     */
    @Override
    public ResultInfo<TenantVO> queryTenantById(Long tenantId) {
        Tenant tenant = tenantRepository.getTenantById(tenantId);
        TenantVO tenantVO = tenantConvert.entityToVO(tenant);
        return ResultInfo.<TenantVO>builder().data(tenantVO).message("租户定义查询成功").build();
    }

    /**
     * 分页查询租户定义
     * @param tenantQueryDTO 租户定义参数
     */
    @Override
    public ResultInfo<Page<TenantVO>> queryTenantPage(TenantDTO.QueryDTO tenantQueryDTO) {
        Page<Tenant> tenantPage = tenantRepository.getTenantPage(tenantQueryDTO);
        Page<TenantVO> resultData = tenantConvert.convertPage(tenantPage);
        return ResultInfo.<Page<TenantVO>>builder()
                .data(resultData)
                .message("租户定义分页查询成功，共 {} 条", resultData.getRecords().size())
                .build();
    }

    /**
     * 根据条件查询 租户定义 数量
     * @param tenantQueryDTO 租户定义参数
     */
    @Override
    public ResultInfo<Long> queryTenantCount(TenantDTO.QueryDTO tenantQueryDTO) {
        Long resultCount = tenantRepository.getTenantCount(tenantQueryDTO);
        return ResultInfo.<Long>builder()
                .data(resultCount)
                .message("租户定义数量查询成功，共 {} 条", resultCount)
                .build();
    }

    /**
     * 根据条件查询 租户定义
     * @param tenantQueryDTO 租户定义参数
     */
    @Override
    public ResultInfo<List<TenantVO>> queryTenantList(TenantDTO.QueryDTO tenantQueryDTO) {
        List<Tenant> tenantList = tenantRepository.getTenantList(tenantQueryDTO);
        List<TenantVO> resultData = tenantConvert.entityListToVoList(tenantList);
        return ResultInfo.<List<TenantVO>>builder()
                .data(resultData)
                .message("租户定义分页查询成功，共 {} 条", resultData.size())
                .build();
    }
}
